﻿using System;
using System.Collections.Generic;
using System.Text;

namespace CppIDE.Core
{

    /// <summary>
    /// Az alkalmazás fő osztálya, kezeli a konfigurációt, az aktuális projektet és annak változását.
    /// </summary>
    public class Application
    {

        /// <summary>
        /// Az Application konstruktora, privát, mert a statikus
        /// getInstance() segítségével kell a példányhoz hozzáférni.
        /// </summary>
        private Application()
        {
            ActiveProjectChange += delegate(Object s, EventArgs a) { };
            string configPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase.ToString();
            configFile = new File(configPath + "config.xml");
        }

        /// <summary>
        /// Az aktuális példány.
        /// </summary>
        private static Application instance = null;

        /// <summary>
        /// Visszaadja az aktuális példányt; ha nem létezik, akkor létrehozza.
        /// </summary>
        /// <returns>Az aktuális példány</returns>
        public static Application getInstance()
        {
            if (instance == null)
            {
                instance = new Application();
            }
            return instance;
        }

        /// <summary>
        /// Az aktuális projekt.
        /// </summary>
        private Project activeProject = null;

        /// <summary>
        /// Az aktuális projekt tulajdonság.
        /// </summary>
        /// <value>Az aktuális projekt</value>
        public Project ActiveProject
        {
            get
            {
                return activeProject;
            }
            private set
            {
                activeProject = value;
                if (activeProject != null)
                {
                    activeProject.Change += new EventHandler(ActiveProjectChange);
                }
                ActiveProjectChange(this, null);
            }
        }

        /// <summary>
        /// Ha megnyílik, bezáródik vagy megváltozik egy projekt, akkor ez az esemény
        /// megtörténik.
        /// </summary>
        public event EventHandler ActiveProjectChange;

        /// <summary>
        /// Visszaadja, hogy van-e megnyitva projekt. (Azaz van-e aktív projekt.)
        /// </summary>
        /// <returns>Van-e nyitot projekt?</returns>
        public bool isProjectLoaded()
        {
            return (ActiveProject != null);
        }

        /// <summary>
        /// Bezárja az aktuális projektet.
        /// </summary>
        public void closeProject()
        {
            ActiveProject = null;
        }

        /// <summary>
        /// Megnyitja a paraméterben megadott projektet.
        /// </summary>
        /// <param name="path">A megnyitandó projektfájl teljes elérési útja</param>
        /// <returns>Sikerült-e megnyitni?</returns>
        public bool openProject(String path)
        {
            if (isProjectLoaded())
            {
                closeProject();
            }
            ActiveProject = Project.open(path);
            return isProjectLoaded();
        }

        /// <summary>
        /// Új projekt létrehozása.
        /// </summary>
        /// <returns>Az új projekt</returns>
        public Project newProject()
        {
            if (isProjectLoaded())
            {
                closeProject();
            }
            ActiveProject = new Project();
            return ActiveProject;
        }

        /// <summary>
        /// A konfigurációt tartalmazó fájl
        /// </summary>
        private File configFile = null;

        /// <summary>
        /// A konfiguráció
        /// </summary>
        private Configuration config = null;

        /// <summary>
        /// A konfiguráció tulajdonság
        /// </summary>
        /// <value>A konfiguráció</value>
        public Configuration Config
        {
            get
            {
                if (config == null)
                {
                    config = Configuration.open(configFile);
                    if (config == null)
                    {
                        config = new Configuration();
                    }
                }
                return config;
            }
        }

        /// <summary>
        /// Menti az aktuális konfigurációt.
        /// </summary>
        public void saveConfig()
        {
            Config.save(configFile);
        }

    }

}